# mppgl.py
"""
MPPGL (每克肝脏的微粒体蛋白含量) 计算模块
"""
from .variation_utils import apply_variation

def calculate_base_mppgl(age, mppgl_baseline, mppgl_c1, mppgl_c2, mppgl_c3, mppgl_mean):
    """
    计算基础MPPGL值(无变异)
    
    公式: MPPGL = 10^(baseline + c1*age + c2*age^2 + c3*age^3)
    
    参数:
    age: 年龄(岁)
    mppgl_baseline: MPPGL基准值
    mppgl_c1: 年龄一次项系数
    mppgl_c2: 年龄二次项系数
    mppgl_c3: 年龄三次项系数
    mppgl_mean: 平均MPPGL值(当系数全为0时使用)
    
    返回:
    基础MPPGL值 (mg/g)
    """
    # 检查年龄是否有效 (必须为非负数)
    if age < 0:
        raise ValueError(f"年龄必须为非负数: {age}")
    
    # 如果系数全为0，返回平均值
    if mppgl_c1 == 0 and mppgl_c2 == 0 and mppgl_c3 == 0:
        return mppgl_mean
    
    # 使用公式计算MPPGL
    exponent = (mppgl_baseline + 
               mppgl_c1 * age + 
               mppgl_c2 * age**2 + 
               mppgl_c3 * age**3)
    
    mppgl = 10 ** exponent
    
    return mppgl

def calculate_mppgl(age, mppgl_baseline, mppgl_c1, mppgl_c2, mppgl_c3, mppgl_mean, mppgl_cv):
    """
    计算每克肝脏的微粒体蛋白含量(MPPGL)，包含变异
    
    参数:
    age: 年龄(岁)
    mppgl_baseline: MPPGL基准值
    mppgl_c1: 年龄一次项系数
    mppgl_c2: 年龄二次项系数
    mppgl_c3: 年龄三次项系数
    mppgl_mean: 平均MPPGL值(当系数全为0时使用)
    mppgl_cv: MPPGL变异系数(%)
    
    返回:
    MPPGL值 (mg/g)
    """
    # 获取基础MPPGL值
    base_mppgl = calculate_base_mppgl(age, mppgl_baseline, mppgl_c1, mppgl_c2, mppgl_c3, mppgl_mean)
    
    # 应用变异
    return apply_variation(base_mppgl, mppgl_cv)
